home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / haeberli / pstools / pscat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  4.0 KB  |  198 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.  *    pscat -
  19.  *        Concatenate PostScript files for book 
  20.  *    generation.
  21.  *
  22.  *    To compile:
  23.  *        cc pscat.c -o pscat 
  24.  *
  25.  *                Paul Haeberli - 1993
  26.  */
  27. #include "stdio.h"
  28. #include "math.h"
  29. #include "ctype.h"
  30.  
  31. #define INBUFSIZE    4096
  32. #define MAXPAGES    1000
  33.  
  34. char buf[INBUFSIZE];
  35. int secstart[MAXPAGES];
  36. int secend[MAXPAGES];
  37. int trailstart;
  38. int trailend;
  39.  
  40. sizeoffile(f)
  41. FILE *f;
  42. {
  43.     int pos, ret;
  44.  
  45.     pos = ftell(f);
  46.     if ((ret = fseek(f,0,2)) < 0) {
  47.         fprintf(stderr,"sizeoffile: seek error\n");
  48.         exit(1);
  49.     }
  50.     ret = ftell(f);
  51.     if (fseek(f,pos,0) < 0) {
  52.         fprintf(stderr,"sizeoffile: seek error\n");
  53.         exit(1);
  54.     }
  55.     return ret;
  56. }
  57.  
  58. indexpages(inf)
  59. FILE *inf;
  60. {
  61.     int i, n, before, after;
  62.  
  63.     n = 0;
  64.     trailstart = 0;
  65.     trailend = 0;
  66.     while(fgets(buf,INBUFSIZE,inf)) {
  67.     if(strncmp(buf,"%%Page:",7) == 0) {
  68.         after = ftell(inf);
  69.         if(n>0)
  70.         secend[n-1] = before;
  71.         secstart[n] = after; 
  72.         n++;
  73.     } else if(strncmp(buf,"%%Trailer",9) == 0) {
  74.         after = ftell(inf);
  75.         if(n>0)
  76.         secend[n-1] = before;
  77.         trailstart = after;
  78.         trailend = sizeoffile(inf);
  79.         return n;
  80.     }
  81.     before = ftell(inf);
  82.     }
  83.     secend[n-1] = ftell(inf);
  84.     return n;
  85. }
  86.  
  87. putpage(inf,pageno,npages)
  88. FILE *inf;
  89. int pageno, npages;
  90. {
  91.     int nbytes;
  92.  
  93.     if(pageno<npages && pageno>=0) {
  94.     nbytes = secend[pageno]-secstart[pageno];
  95.     putsection(inf,secstart[pageno],nbytes);
  96.     }
  97. }
  98.  
  99. putsection(inf,start,nbytes)
  100. FILE *inf;
  101. int start, nbytes;
  102. {
  103.     int nr;
  104.  
  105.     fseek(inf,start,0);
  106.     while(nbytes>0) {
  107.     if(!fgets(buf,INBUFSIZE,inf)) {
  108.         fprintf(stderr,"pscat: bad read in putsection\n");
  109.         exit(1);
  110.     }
  111.     nr = strlen(buf);
  112.     nbytes -= nr;
  113.     if(buf[0] != '%')
  114.         fputs(buf,stdout);
  115.     }
  116.     if(nbytes != 0) {
  117.     fprintf(stderr,"pscat: strange read in putsection\n");
  118.     exit(1);
  119.     }
  120. }
  121.  
  122. main(argc,argv)
  123. int argc;
  124. char **argv;
  125. {
  126.     FILE *inf;
  127.     int npages, i, outpage;
  128.     float xoff, yoff, scale;
  129.     char *infile;
  130.  
  131.     if(argc<5) {
  132.      fprintf(stderr,"\nusage: pscat in.ps xoff yoff scale\n");
  133.      fprintf(stderr,"         [in2.ps xoff yoff scale] ... > out.ps\n");
  134.      fprintf(stderr,"\n");
  135.      exit(1);
  136.     }
  137.     printf("%%!PS-Adobe-2.0\n");
  138.     printf("%%%%EndComments\n");
  139.     outpage = 1;
  140.     i = 1;
  141.     for(i=1; i<argc-3; i+=4) {
  142.     infile = argv[i+0];
  143.     xoff = atof(argv[i+1]);
  144.     yoff = atof(argv[i+2]);
  145.     scale = atof(argv[i+3]);
  146.     inf = fopen(infile,"r");
  147.     if(!inf) {
  148.          fprintf(stderr,"pscat: can't open %s\n",argv[1]);
  149.          exit(1);
  150.     }
  151.     npages = indexpages(inf);
  152.     fprintf(stderr,"Document pages %d\n",npages);
  153.  
  154.     if(npages == 0) {
  155.         secend[0] = sizeoffile(inf);
  156.         secstart[0] = 0;
  157.         npages = 1;
  158.     } 
  159.     putpages(inf,npages,outpage,xoff,yoff,scale);
  160.     outpage += npages;
  161.     fclose(inf);
  162.     }
  163.     exit(0);
  164. }
  165.  
  166. putpages(inf,npages,outpage,xoff,yoff,scale)
  167. FILE *inf;
  168. int npages, outpage;
  169. float xoff, yoff, scale;
  170. {
  171.     int pageno;
  172.     
  173.     for(pageno=0; pageno<npages; pageno++) {
  174.     printf("%%%%Page: page%d %d\n",outpage+pageno,outpage+pageno);
  175.     dosave(inf);
  176.     printf("%f %f scale\n",scale,scale);
  177.     printf("%f %f translate\n",72.0*xoff,72.0*yoff);
  178.     putsection(inf,0,secstart[0]);
  179.     putpage(inf,pageno,npages);
  180.     dorestore(inf);
  181.     }
  182.     printf("%%%%EOF\n");
  183. }
  184.  
  185. dosave(inf)
  186. FILE *inf;
  187. {
  188.     printf("gsave\n");
  189. }
  190.  
  191. dorestore(inf)
  192. FILE *inf;
  193. {
  194.     if(trailstart) 
  195.     putsection(inf,trailstart,trailend-trailstart);
  196.     printf("grestore\n"); 
  197. }
  198.